[iOS 8] Android脳に効く!新言語「Swift」超入門 #5 クラスとストラクチャ
クラスとストラクチャの違い
クラスにはなじみがあると思いますが、ストラクチャはあまり聞き慣れない言葉かと思います。クラスとストラクチャの大きな違いは、クラスは参照型でストラクチャは値型だということです。クラスはそのオブジェクトのやりとりを参照ポインタで行いますが、ストラクチャはその都度値がコピーされます。
ストラクチャはクラスのように継承等は出来ませんが、値を定義したいときに活用できる便利なタイプです。
クラスとストラクチャはそれぞれ次のように定義します。
Swift Code
// クラスの定義 class SomeClass { } // ストラクチャの定義 struct SomeStructure { }
一見すると名前が異なるだけのような印象を受けると思いますが、先述した通りインスタンス化した時にクラスは参照がわたされ、ストラクチャはコピーが渡される点で大きく違います。
その他、共通の機能とクラスのみ提供される機能については次の通りです。
共通の機能
- 値とメソッドが定義できる
- Subscriptが定義できる
- イニシャライザが定義できる
- エクステンションをつかった機能の拡張が出来る
- プロトコルに準拠させることができる
クラスだけの機能
- 継承
- クラスは参照カウントがゼロになるとデイニシャライザによって解放される
- イニシャライザが定義できる
- 型のキャストが可能
プロパティとイニシャライザ
Swift Code
// クラス class User { // プロパティ var id: Int var name: String // イニシャライザ init(id: Int, name: String){ self.id = id self.name = name } } // インスタンス化 var user = User(id: 99, name: "Taro") // プロパティにアクセス println(user.name) // Taro // ストラクチャ struct Rect { // プロパティ var x: Int var y: Int } // インスタンス化 var rect = Rect(x: 10, y: 20) // プロパティにアクセス println(rect.x) // 10
プロパティ
プロパティはクラス、ストラクチャ共にvarまたはletを使って宣言することができます。プロパティを宣言時に初期化しない場合は後述するイニシャライザで必ず初期化する必要があります。
Javaでクラスを作るときのメンバ変数と同じイメージです。しかし、クラスがインスタンス化されるときまでにプロパティは必ず明示的に初期化されなければなりません。この点がJavaのメンバ変数とは大きく異なることに注意してください。
イニシャライザ
イニシャライザはinit()で定義します。[8-11行目]イニシャライザは明示的な定義の有無に関わらず自動的に引数をもたないデフォルトイニシャライザが生成されます。
また、ストラクチャに関しては明示的にイニシャライザを定義しない場合にはデフォルトイニシャライザと全てのプロパティを引数にとるイニシャライザが自動で生成されます。そのため、[26行目]のようにサンプルコードではストラクチャRectをインスタンス化する際にイニシャライザを定義していないのにも関わらず、引数の入力が必須になります。
少し紛らわしいかもしれませんが、イニシャライザはJavaクラスのコンストラクタと似たようなものであるという認識でまずは問題ないと思います。
クラスの継承
SwiftはJavaと同様に多重継承をサポートしていません。
継承の仕方はとても簡単でJavaでextendsと記述してスーパークラスを指定していたところを:に置き換えるだけです。
Swift Code
// 継承 class SubClass : SuperClass { ...... }
ここではメソッド自体の解説はしませんが、考え方は同じでスーパークラスのメソッドをオーバーライドする場合はoverride属性の指定が必須となります。
まとめ
クラスとストラクチャについての概要を紹介しました。クラスについては抵抗無く受け入れられると思いますが、ストラクチャはどうでしょうか?すぐによい活用シーンがイメージできなくても、きっと役に立つ便利機能であることは間違いないでしょう。その時まで頭の片隅に記憶しておくといいかもしれません。
おわりに
ここまで5回に渡り、Android脳に効く!新言語「Swift」超入門と題して新言語Swiftの概要を紹介してきました。
これまでAndroid開発専門でJavaでの開発経験しかないような場合でもSwiftはJavaとの共通点も多く非常に読みやすく抵抗なく理解できると思います。
新言語Swift、これからのiOS開発の入門の入門としてお役に立てれば幸いです。
バックナンバー
[iOS 8]Android脳に効く!新言語「Swift」超入門 #1 変数の宣言と型
[iOS 8]Android脳に効く!新言語「Swift」超入門 #2 Optional基礎
[iOS 8]Android脳に効く!新言語「Swift」超入門 #3 制御構造
[iOS 8]Android脳に効く!新言語「Swift」超入門 #4 関数とクロージャ
[iOS 8]Android脳に効く!新言語「Swift」超入門 #5 クラスとストラクチャ